package com.ctesi.service.zhaobiao.anhui;

import com.ctesi.utils.PutUtil;
import com.ctesi.utils.StringExtract;
import lombok.Data;
import org.springframework.stereotype.Service;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.model.HttpRequestBody;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.utils.HttpConstant;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Random;

//post请求：https://ggzy.ah.gov.cn/jsgc/list
//返回的是一个html页面
@Data
@Service
public class AnHuiProcessorService implements PageProcessor {
    private Site site;
    private String bidType;
    @Override
    public void process(Page page) {
        Random random = new Random();
        // 生成5000到10000之间的随机整数
        int randomTime = random.nextInt(10000 - 5000 + 1) + 5000;
        //设置请求头和等待时间
        this.site = Site.me()
                .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
                .setTimeOut(randomTime) // 设置超时时间为5秒到10秒之间的数
                .setRetryTimes(5); // 设置重试次数为 3 次
        site.addHeader("Connection", "keep-alive");
        String currentUrl = page.getUrl().get();
        if (currentUrl.contains("list")) {
            System.out.println("----------------开始裂变url-----------------------");
            //裂变url执行逻辑
            for (int i = 1; i <= 10; i++) {
                String time = page.getHtml().xpath(String.format("/html/body/div/div[3]/div[3]/div/div[2]/div[3]/ul[2]/li[%d]/span/text()", i)).toString();
                String url = page.getHtml().xpath(String.format("/html/body/div/div[3]/div[3]/div/div[2]/div[3]/ul[2]/li[%d]/a/@href", i)).toString();
                if (time.contains("2023")) {
                    page.addTargetRequest(url);
                    System.out.println("----添加成功-----");
                } else {
                    System.out.println("非2023年的招标公告，舍去。");
                }
                System.out.println();
            }

        } else if (!currentUrl.equals("https://ggzy.ah.gov.cn/jsgc/newDetailSub")) {
            System.out.println("------------------正在爬取响应内容--------------");
            //爬取内容逻辑,这个网站使用了guid来二次渲染内容，先获取本url的guid，然后创建post请求请求上去得到响应,响应的是一个html页面。
            String localUrl = page.getUrl().get();
            String guid = StringExtract.extractTextByRegex(localUrl, "guid=(.*?)&");
            Request request = new Request("https://ggzy.ah.gov.cn/jsgc/newDetailSub");
            request.setMethod(HttpConstant.Method.POST);

            String params = String.format("type=tender&bulletinNature=1&guid=%s&statusGuid=", guid);  //urlencode参数
            byte[] houseParamsBytes = params.getBytes(StandardCharsets.UTF_8);    //转成字节数组
            request.setRequestBody(HttpRequestBody.custom(houseParamsBytes, "application/x-www-form-urlencoded", "UTF-8"));
            page.addTargetRequest(request);

        } else {
            //对post请求下来的数据进行解析

            //招标主体内容
            String bidContext = page.getHtml().get();
            bidContext = StringExtract.removeTags(StringExtract.removeNbsp(bidContext));
            System.out.println(bidContext);

            //招标主体信息

            //招标编号
            PutUtil.putField(page, bidContext, "项目编号：(.*?)\\n", "bidId");

            //招标类型
            page.putField("bidType",bidType);

            ///招标省份
            page.putField("bidProvince", "安徽省");

            //招标范围
            PutUtil.putField(page, bidContext, "招标范围：(.*?)\n", "bidArange");

            //项目名称
            PutUtil.putField(page, bidContext, "项目名称：(.*?)\\n", "bidTitle");

            //项目发布时间
            PutUtil.putField(page, bidContext, "公告时间：(.*?)\\n", "bidPubTime");

            //备注：没有这个字段

            //数据创建时间
            LocalDateTime createTime = LocalDateTime.now();
            page.putField("createTime", createTime);

            //数据更新时间
            LocalDateTime updateTime = LocalDateTime.now();
            page.putField("updateTime", updateTime);

            //招标网址
            String originUrl = page.getHtml().xpath("/html/body/div[1]/a/@href").get();
            page.putField("bidUrl",originUrl);

            //招标地区
            PutUtil.putField(page, bidContext, "^.{2}县|市$", "bidArea");

            //资格要求
            PutUtil.putField(page, bidContext, "投标人须具备(.*?)资质", "bidCredit");

            //评标办法
            PutUtil.putField(page, bidContext, "本招标项目评标办法采用(.*?)", "bidJudgeMethod");

            //招标状态：没有这个字段


            //招标人信息
            PutUtil.putField(page, bidContext, "招标人：(.*?)\\n", "bidUnity");

            //招标联系人
            PutUtil.putField(page, bidContext, "招标人：.*?\\n.*?\\n.*?联系人：(.*?)\\n", "bidName");

            //招标联系人电话
            PutUtil.putField(page, bidContext, "招标人：.*?\\n.*?\\n.*?联系人：.*?\\n.*?电话：(.*?)\\n", "bidPhone");

            //招标地址
            PutUtil.putField(page, bidContext, "招标人：(.*?)\\n.*?地址：(.*?)\\n", "bidAddress");

            //代理机构信息

            //代理机构
            PutUtil.putField(page, bidContext, "招标代理机构：(.*?)\\n", "agencyUnity");

            //代理机构联系人姓名
            PutUtil.putField(page, bidContext, "招标代理机构：.*?\\n.*?\\n.*?联系人：(.*?)\\n", "agencyName");

            //代理机构联系人电话
            PutUtil.putField(page, bidContext, "招标代理机构：.*?\\n.*?\\n.*?联系人：.*?\\n.*?电话：(.*?)\\n", "agencyPhone");

            //代理机构地址
            PutUtil.putField(page, bidContext, "招标代理机构：(.*?)\\n.*?地址：(.*?)\\n", "agencyAddress");


        }

    }

    @Override
    public Site getSite() {
        return PageProcessor.super.getSite();
    }
}
